#ifndef H_WFQQUEUE_H
#define H_WFQQUEUE_H

#include <queue>
#include <vector>
#include "ns3/queue.h"
#include "ns3/tag.h"
#include "ns3/ipv4-header.h"
#include "ns3/udp-header.h"

namespace ns3 {
//	class MTag;
//	class WeightTag;

class H_WFQQueue : public Queue {
public:
  static TypeId GetTypeId(void);
  H_WFQQueue();
  virtual ~H_WFQQueue();

//private:
  virtual bool DoEnqueue(Ptr<QueueItem> item);
  virtual Ptr<QueueItem> DoDequeue(void);
 // virtual Ptr<const QueueItem> DoPeek(void) const;
 // virtual bool UpdateQueueWeight(WeightTag WTag);
 // virtual bool AddQueue(uint32_t queueNum);
uint32_t GetTosValue(Ptr<QueueItem> item);
void ComputeFinishTime(Ptr<Packet> pkt, uint32_t enqID);
uint32_t GetDeqID(void);

uint32_t GetEnqID(uint32_t tosValue);
  std::vector<std::queue<Ptr<QueueItem> > >  m_packets;
  uint32_t m_limit;
  std::vector<uint32_t> m_weight;
  	Ptr<const QueueItem> DoPeek(void) const;
  std::vector<std::vector<double> > m_finish;
  //std::queue<Ptr<QueueItem> >  m_packets;
}; // class H_WFQQueue

}  // namespace ns3

#endif /* H_WFQQUEUE_H */
